package naturezaChamado;

import naturezaChamado.excecao.LimiteNaturezasChamadoAtingidoException;
import naturezaChamado.excecao.NaturezaChamadoNaoEncontradaException;
import java.io.*;
import java.lang.*;

public class RepositorioNaturezaChamadoArquivo implements IRepositorioNaturezaChamado {

    private static String baseDeDados = null;
    
    public RepositorioNaturezaChamadoArquivo() {
        baseDeDados = 
            new File("").getAbsolutePath() + 
            System.getProperty("file.separator") + 
            "natureza_chamado.txt";
    }
    
    public void cadastrar(NaturezaChamado natureza) throws IOException, FileNotFoundException {
        File arquivo = new File(baseDeDados);
        RandomAccessFile escreve = new RandomAccessFile(arquivo, "rw");
        String registroEditado = formatarRegistro(natureza);
        escreve.seek(escreve.length()); 
        escreve.writeBytes(registroEditado);
        escreve.writeBytes("\r\n");
        escreve.close();           
    }
    
    public void alterar(NaturezaChamado natureza) throws NaturezaChamadoNaoEncontradaException, IOException ,FileNotFoundException {
        File arquivo = new File(baseDeDados);
        RandomAccessFile ler = new RandomAccessFile(arquivo, "rw");
        int tamanhoArray = getTamanho();
        String registroEditado = formatarRegistro(natureza);
        NaturezaChamado naturezaAtual = new NaturezaChamado();
        NaturezaChamado[] dados = new NaturezaChamado[tamanhoArray];        
        String registro;
        boolean eof = false;
        int i = 0;
        while (!eof) {
            registro = ler.readLine();
            if (registro != null) {
                naturezaAtual = extrairRegistro(registro);
                if (naturezaAtual.getId() == naturezaAtual.getId()) {
                    dados[i] = extrairRegistro(registroEditado);
                } else {
                    dados[i] = extrairRegistro(registro);
                }
            } else {
                eof = true;
            }
            i++;
        }
        ler.close();
        arquivo.delete();
        arquivo.createNewFile();
        for (i = 0; i < tamanhoArray; i++) {
            cadastrar(dados[i]);
        }        
    }
    
    public void excluir(int id) throws NaturezaChamadoNaoEncontradaException, IOException, FileNotFoundException {
        File arquivo = new File(baseDeDados);
        RandomAccessFile ler = new RandomAccessFile(arquivo, "rw");
        NaturezaChamado naturezaAtual = new NaturezaChamado();
        int tamanhoArray = getTamanho();
        if (procurar(id)) {
            String[] dados = new String[tamanhoArray - 1];
            String[] campos;
            String registro;
            int i = 0;
            boolean eof = false;
            while (!eof) {
                registro = ler.readLine();
                if (registro != null) {
                    naturezaAtual = extrairRegistro(registro);
                    if (id != naturezaAtual.getId()) {
                        dados[i] = registro;
                        i++;
                    }
                } else {
                    eof = true;
                }
            }
            ler.close();
            arquivo.delete();
            arquivo.createNewFile();
            for (i = 0; i <= tamanhoArray; i++) {
                cadastrar(extrairRegistro(dados[i]));
            }
        } else {
            throw new NaturezaChamadoNaoEncontradaException();
        }        
    }
    
    public NaturezaChamado consultar(int id) throws NaturezaChamadoNaoEncontradaException, FileNotFoundException, IOException {
        NaturezaChamado natureza = new NaturezaChamado();
        File arquivo = new File(baseDeDados);
        RandomAccessFile ler = new RandomAccessFile(arquivo, "r");
        String[] dados = null;
        String resultado;
        boolean eof = false;
        boolean encontrado = false;
        int codigoTmp;
        while (!eof) {
            resultado = ler.readLine();
            if (resultado != null) {
                dados = resultado.split("#");
                codigoTmp = Integer.parseInt(dados[0]);
                if (codigoTmp == id) {
                    natureza.setId(codigoTmp);
                    natureza.setTipoProblema(dados[1]);
                    encontrado = true;
                    break;
                }
            } else {
                eof = true;
            }
        }
        ler.close();
        if (!encontrado) {
            throw new NaturezaChamadoNaoEncontradaException();
        } else {
            return natureza;
        }        
    }
    
    public NaturezaChamado[] consultar() throws FileNotFoundException, IOException {
        NaturezaChamado[] nc = new NaturezaChamado[getTamanho()];
        File arquivo = new File(baseDeDados);
        RandomAccessFile ler = new RandomAccessFile(arquivo, "r");
        String[] dados = null;        
        String resultado;
        boolean eof = false;
        int i = 0;
        while (!eof) {
            resultado = ler.readLine();
            if (resultado != null) {
                nc[i] = extrairRegistro(resultado);
                i++;
            } else {
                eof = true;
            }
        }
        ler.close();
        return nc;
    }
    
    public int getTamanho() throws FileNotFoundException, IOException {
        File arquivo = new File(baseDeDados);
        RandomAccessFile ler = new RandomAccessFile(arquivo, "r");
        int i = 0;
        boolean eof = false;
        String resultado;
        while (!eof) {
            resultado = ler.readLine();
            if (resultado == null) {
                eof = true;
            } else {
                i++;
            }
        }
        ler.close();
        return i;        
    }
    
    private boolean procurar(int codigo) throws FileNotFoundException, IOException {
        File arquivo = new File(baseDeDados);
        RandomAccessFile ler = new RandomAccessFile(arquivo, "r");
        String[] dados = null;
        String resultado;
        boolean eof = false;
        boolean encontrado = false;
        int codigoTmp;
        while (!eof) {
            resultado = ler.readLine();
            if (resultado != null) {
                dados = resultado.split("#");
                codigoTmp = Integer.parseInt(dados[0]);
                if (codigoTmp == codigo) {
                    encontrado = true;
                    break;
                }
            } else {
                eof = true;
            }
        }
        ler.close();
        if (!encontrado) {
            return false;
        } else {
            return true;
        }
    }    
    
    private NaturezaChamado extrairRegistro (String registro) {
        NaturezaChamado n = new NaturezaChamado();
        String[] campo = registro.split("#");
        n.setId(Integer.parseInt(campo[0]));
        n.setTipoProblema(campo[1]);
        return n;
    }    
    
    private String formatarRegistro (NaturezaChamado natureza) {
        int codigo = natureza.getId();
        String tipoProblema = natureza.getTipoProblema();
        return codigo + "#" + tipoProblema;
    }    
    
}
